#ifndef CODEC_H
#define CODEC_H

#include <string>
#include "Information.pb.h" // RequestCode、RespondCode
#include <memory>
using namespace std;

/* [Message的数据]和[protobuf消息体中的数据]是对应的
 *    [1] 序列化:   可基于Message结构体的数据进行
 *    [2] 反序列化: 将解析出的数据存储在Message结构体中
*/
struct Message {
    string _userName; // 用户名
    string _roomName; // 房间名
    string _data1;
    string _data2;
    string _data3;
    RequestCode _reqCode;
    RespondCode _resCode;
};

class Codec {
public:
    Codec(Message* msg); // 初始化_obj
    Codec(string msg);   // 初始化_msg

    string encodeMsg();              // 序列化:   得到结构体数据的序列化形式
    shared_ptr<Message> decodeMsg(); // 反序列化: 得到结构体数据的智能指针

    void reLoad(string msg);   // 加载[新的_msg]
    void reLoad(Message* msg); // 加载[新的结构体数据] -> 加载[新的_obj]
private:
    string _msg;      // 结构体数据的序列化形式
    Information _obj; // 记录结构体数据 + 具有处理结构体数据的[序列化+反序列化]方法
};

#endif //CODEC_H
